package com.example.config;

import com.example.comon.domain.LoginUser;
import com.example.comon.exception.ServiceException;
import com.example.comon.service.TokenService;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 自定义拦截器
 *
 */
@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Autowired
    private TokenService tokenService;

    /**
     * 预处理回调方法：preHandle方法在控制器方法（即处理请求的业务逻辑方法）执行前被调用。它可以用来执行一些前置操作，比如权限验证、登录状态检查、请求参数过滤或修改等。
     *
     * 控制流程：此方法的返回值是一个布尔值。如果返回true，表示请求可以继续，后续的拦截器以及目标控制器方法会被正常执行。如果返回false，则表示请求被拦截，后续的拦截器和控制器方法将不会被执行，同时通常会进行一些错误处理或直接向客户端响应特定的信息。
     *
     * 执行顺序：在配置了多个拦截器的情况下，preHandle方法会按照拦截器定义的顺序依次执行。如果某个拦截器的preHandle返回false，则后续的拦截器及处理器都不会再执行。
     *
     * 参数说明：preHandle方法接受三个参数，分别是HttpServletRequest请求对象、HttpServletResponse响应对象和Object handler（即将要处理请求的处理器对象，比如一个控制器方法的实例）。
     * @param request
     * @param response
     * @return
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
        String token =request.getHeader("Authorization");
        if(token ==null){
           throw new ServiceException("未登录，请先登录");
        }
        LoginUser loginUser = tokenService.getLoginUser(request);
        if(loginUser ==null){
            throw new ServiceException("Token（令牌）无效，请重新登录");
        }
        return true;
    }
}
